import errorHandler from './utils/error-handler'

// 检查 Tauri API 是否可用
const isTauriAvailable = typeof window !== 'undefined' && window.__TAURI__ !== undefined

// 预先导入 Tauri API
let tauriInvoke = null;
let tauriApiPromise = null;

if (isTauriAvailable) {
  // 使用动态导入，避免顶层 await
  tauriApiPromise = import('@tauri-apps/api').then(tauriApi => {
    tauriInvoke = tauriApi.invoke;
    console.log('Tauri API loaded successfully');
    return tauriApi.invoke;
  }).catch(error => {
    console.error('Failed to load Tauri API:', error);
    return null;
  });
}

/**
 * 增强的 invoke 函数，包含错误处理和重试机制
 * @param {string} cmd 要调用的 Tauri 命令
 * @param {Object} args 命令参数
 * @returns {Promise} 命令执行结果
 */
export const invoke = async (cmd, args) => {
  if (!isTauriAvailable) {
    console.warn('Tauri API is not available. Running in web-only mode.')
    return Promise.resolve(null)
  }

  // 等待 Tauri API 初始化完成
  if (tauriApiPromise) {
    try {
      await tauriApiPromise;
      if (tauriInvoke) {
        return tauriInvoke(cmd, args);
      } else {
        throw new Error('Tauri API initialization failed');
      }
    } catch (error) {
      console.error('Error waiting for Tauri API:', error);
      throw new Error('Tauri API initialization failed');
    }
  } else {
    throw new Error('Tauri API not available');
  }

  try {
    return await errorHandler.withRetry(() => tauriInvoke(cmd, args))
  } catch (error) {
    console.error(`Error invoking ${cmd}:`, error)
    errorHandler.handleError(error, `Command: ${cmd}`)
    throw error
  }
}

/**
 * 批量执行 Tauri 命令
 * @param {Array} commands 要执行的命令数组，每个元素是 [cmd, args] 形式
 * @returns {Promise} 所有命令的执行结果数组
 */
export const batchInvoke = async (commands) => {
  return Promise.all(commands.map(([cmd, args]) => invoke(cmd, args)))
}

/**
 * 串行执行 Tauri 命令
 * @param {Array} commands 要执行的命令数组，每个元素是 [cmd, args] 形式
 * @returns {Promise} 所有命令的执行结果数组
 */
export const serialInvoke = async (commands) => {
  const results = []
  for (const [cmd, args] of commands) {
    results.push(await invoke(cmd, args))
  }
  return results
}